package javaClassExercise.designPatterns.factoryMethod.generalFactoryMethod;

/**
 * Created by lomo on 2017/3/25.
 * 创建一个测试工厂方法类的测试类
 * 工厂类中已经实现了对Sender接口类的创建， 这个工厂类的作用就是实现了对 实现同一个接口 但是不同方法类的创建/new
 */
public class GeneralFactoryMethodTest {
    public static void main(String... args) {
        SendFactory sendFactory = new SendFactory(); //new实例化一个SendFactory工厂类
        Sender sender = sendFactory.produce("sms");
        sender.send(); //这是另一个Sender接口实现类 -- SmsSender ！！！

        Sender sender1 = sendFactory.produce("mail");
        sender1.send(); //这是Sender接口实现类 -- MailSender !!!
    }
}

/*
  思考: 这样设计一个Sender 发送功能的接口，然后再创建2个发送邮件和发送短信的功能类，再创建一个工厂类对这2个功能类进行实例化创建， 有什么好处？？？
  如何不这样设计呢？
  如果现在需要增加一个发送即时消息(和短信类似)的功能，那么如果不按照这种设计模式写，代码会是怎样的呢？
  按照常有的思考模式: 创建一个类，类中包含三个方法，一个是发送邮件、一个发送短信、加上新增的发送即时消息的方法，测试使用时，需要new这个类，然后再调用对应的方法。
  这样写下去，如果以后还有其它好多个发送类的方法需要扩展，则需要修改这个原始类文件，使得这个类变得臃肿，难以维护.
  而， 使用工厂模式呢？ 多有发送类的具体方法都属于各自的类(这些类又实现自同一个Sender接口类)，这个发送类的方法不用考虑是否影响其他类功能，
  只需要专注实现、完美自己的功能，然后再在对应的工厂类中实现对应实例的创建，在调用的时候只需new工厂类，通过工厂类去创建对应方法的实例，
  实现层级化(层级清晰，不是传统的流水账模式)，同时便于拓展、维护！


 */